home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / incosrc / incosrc.exe / BALLS / BALLS.ASM next >
Assembly Source File  |  1993-08-14  |  21KB  |  839 lines

  1. ; ------------------------------ BALLS.ASM ------------------------------
  2. ; Bye Jare of VangeliSTeam. Want more comments? Write'em. O:-)
  3.  
  4. TRACE  = 0
  5.  
  6.         .MODEL SMALL
  7.         .STACK 400
  8.         .386
  9.         DOSSEG
  10.         LOCALS
  11.         JUMPS
  12.  
  13. INCLUDE VGASM.INC
  14. INCLUDE VBLIB.INC
  15. INCLUDE VTASM.INC
  16.  
  17. SCRW = 80
  18. CRDMULT = 3
  19. SZBALL = 16
  20. BALLPIXSZ = 16*15-12*4
  21. NBALLS = 20
  22.  
  23. SCREENOFF1 = SCRW*216*0
  24. SCREENOFF2 = SCRW*216*1
  25. SCREENOFF3 = SCRW*216*2
  26.  
  27. LG01 SEGMENT WORD PUBLIC
  28.    EXTRN LogoBall : BYTE
  29. ENDS
  30.  
  31.  
  32.         .CODE
  33.         .STARTUP       
  34.         CLD
  35.  
  36.         CALL    SetupBallsVideo
  37.         CALL    CreateBallsPix
  38.  
  39.         XOR     SI,SI
  40.         CALL    InitializeTimerVBL
  41.  
  42.         CALL    InitMusic
  43.         CALL    VTBeginSync
  44.         CALL    VTWaitForStart
  45.  
  46.         CALL    VBLVSync
  47.  
  48. MainLoop:
  49.         MOV     CX,4000
  50. ;        LOOP $
  51.         SetBorder 0, 0, 0
  52.         WaitForDisplay
  53.         CALL    SetDisplayPage
  54.  
  55.         CALL    VBLVSync
  56.         MOV     [NFrames],AX
  57.  
  58. ; VSync
  59.         INC     [FrameCounter]
  60.         MOV     CX,4000
  61. ;        LOOP $
  62.         SetBorder 0, 0, 63
  63.  
  64.         CALL    CreateBalls
  65.  
  66.         MOV     CX,[NFrames]
  67.         MOV     CX,1
  68.     @@mlp:
  69.          PUSH   CX
  70.          CALL   AnimateBalls
  71.          CALL   TestCollisions
  72.          POP    CX
  73.          LOOP   @@mlp
  74.  
  75.         SetBorder 63,63,0
  76.  
  77.         CALL    CallMusic
  78.  
  79.  
  80.         MOV     AH,1
  81.         INT     16h
  82.         JNZ     @@Bye
  83.  
  84.         CMP     [DoNotStop],0
  85.         JZ      ByeBye
  86.         JMP     MainLoop
  87.  
  88.    @@Bye:
  89.         MOV     AH,0
  90.         INT     16h
  91.  
  92. ByeBye:
  93.         CALL    EndTimerVBL
  94. ;        CALL    ZeroPalette
  95. ;        MOV     AX,3
  96. ;        INT     10h
  97.  
  98.         CALL    VTConnectTimer
  99.  
  100.         CALL    RestoreSystemTime
  101.  
  102.         MOV     AX,4C00h
  103.         INT     21h
  104.  
  105.  
  106. ; =======================================
  107.  
  108. SetupBallsVideo:
  109. COMMENT #
  110.         CALL    ZeroPalette
  111.         MOV     AX,13h
  112.         INT     10h
  113.         CALL    ZeroPalette
  114.  
  115.         VSync
  116.         MOV     DX,3C0h
  117.         MOV     AL,30h
  118.         OUT     DX,AL
  119.         MOV     AL,01100001b
  120.         OUT     DX,AL 
  121.  
  122.         MOV     DX,3c4h
  123.         MOV     AX,604h                 ; "Unchain my heart". And my VGA...
  124.         OUT     DX,AX
  125.         MOV     AX,0F02h                ; All planes
  126.         OUT     DX,AX
  127.         
  128.         ; Comienzo del modo de Hz reducidos.
  129.  
  130.         MOV     DX,3D4h
  131.         MOV     CX,18h
  132.         MOV     SI,OFFSET CRTCregs
  133.      @@cl1:
  134.          LODSW
  135. ;         OUT    DX,AX
  136.          LOOP   @@cl1
  137.  
  138.         ; Final del modo de Hz reducidos.
  139.  
  140.         MOV     AX,14h                  ; Disable dword mode
  141.         OUT     DX,AX
  142.         MOV     AX,0E317h               ; Enable byte mode.
  143.         OUT     DX,AX
  144. #
  145.         VSync
  146.         XOR     AX,AX
  147.         MOV     DX,3C8h
  148.         OUT     DX,AL
  149.         INC     DX
  150.         DEC     AX
  151.         MOV     CX,256
  152.      @@p1:
  153.          OUT    DX,AL
  154.          OUT    DX,AL
  155.          OUT    DX,AL
  156.          LOOP   @@p1
  157.         PUSH    DS
  158.         POP     ES
  159.         MOV     DI,OFFSET SourcePalette
  160.         MOV     CX,256*3/2
  161.         MOV     AX,3F3Fh
  162.         REP STOSW
  163.         
  164.         MOV     DX,3c4h
  165.         MOV     AX,0F02h                ; All planes
  166.         OUT     DX,AX
  167.  
  168.         XOR     DI,DI                   ; Clear the screen. All planes.
  169.         MOV     AX,0A000h
  170.         MOV     ES,AX
  171.         MOV     CX,8000h
  172.         XOR     AX,AX
  173.         REP STOSW
  174.  
  175.         PUSH    DS
  176.         MOV     AX,SEG LogoBall
  177.         MOV     DS,AX
  178.         MOV     SI,OFFSET LogoBall
  179.         MOV     BX,104h
  180.     @@lp0:
  181.          MOV    DX,3C4h
  182.          MOV    AL,02h                ; One plane at a time.
  183.          MOV    AH,BH
  184.          OUT    DX,AX
  185.          MOV    DI,16*SCRW
  186.          PUSH   SI   
  187.          MOV    CX,64000/4
  188.     @@lp1:LODSB
  189.           MOV   ES:[DI+SCRW*216*2],AL
  190.           MOV   ES:[DI+SCRW*216],AL
  191.           STOSB
  192.           ADD   SI,3
  193.           LOOP  @@lp1
  194.          POP    SI
  195.          INC    SI
  196.          SHL    BH,1
  197.          DEC    BL
  198.          JNZ    @@lp0
  199.         POP     DS
  200.         CALL    SetDisplayPage
  201.         VSync
  202.  
  203.         MOV     CX,32
  204.      @@f1:
  205.          PUSH   CX
  206.          VSync
  207.          MOV    SI,OFFSET SourcePalette
  208.          MOV    CX,128
  209.          XOR    AL,AL
  210.          CALL   DumpPalette
  211.          VSync
  212.          MOV    SI,OFFSET SourcePalette+128*3
  213.          MOV    CX,128
  214.          MOV    AL,128
  215.          CALL   DumpPalette
  216.             REPT 2
  217.                  MOV    SI,OFFSET NormalPalette
  218.                  MOV    DI,OFFSET SourcePalette
  219.                  MOV    CX,256
  220.                  XOR    DH,DH
  221.                  CALL   FadePal
  222.             ENDM
  223.         POP     CX
  224.         LOOP    @@f1
  225.  
  226.         VSync
  227.         MOV     SI,OFFSET NormalPalette
  228.         MOV     CX,256
  229.         XOR     AL,AL
  230.         CALL    DumpPalette
  231.  
  232.         RET
  233.  
  234.  
  235. ; =======================================
  236.  
  237. EraseBall:
  238.         MOV     DI,[SI+12]
  239.         MOV     CL,[SI+10]
  240.         TEST    [FrameCounter],1
  241.         JNZ     @@c1
  242.          MOV    DI,[SI+14]
  243.          MOV    CL,[SI+11]
  244.     @@c1:
  245.         MOV     SI,SCREENOFF3
  246.         CMP     DI,SCREENOFF1
  247.         JZ      @@ret
  248.         CMP     DI,SCREENOFF2
  249.         JZ      @@ret
  250.         JC      @@goon
  251.          SUB    SI,SCREENOFF2
  252.     @@goon:
  253.         ADD     SI,DI
  254.         MOV     DX,3C4h
  255.         MOV     AX,0F02h                ; All planes
  256.         OUT     DX,AX
  257.         MOV     DX,3CEh                 ; Bitmask...
  258.         MOV     AX,00008h               ; 00000000b
  259.         OUT     DX,AX
  260.         PUSH    DS
  261.         MOV     AX,0A000h
  262.         MOV     ES,AX
  263.         MOV     DS,AX
  264.         XOR     AX,AX
  265.         TEST    CL,3
  266.         JNZ     @@noexact
  267.         MOV     CX,SCRW-4
  268.         REPT   15
  269.           MOVSB
  270.           MOVSB
  271.           MOVSB
  272.           MOVSB
  273.           ADD   DI,CX
  274.           ADD   SI,CX
  275.         ENDM
  276.         JMP     @@bye
  277.    @@noexact:
  278.         MOV     CX,SCRW-5
  279.         REPT   15
  280.            MOVSB
  281.            MOVSB
  282.            MOVSB
  283.            MOVSB
  284.            MOVSB
  285.           ADD   DI,CX
  286.           ADD   SI,CX
  287.         ENDM
  288.     @@bye:
  289.         MOV     DX,3CEh                 ; Bitmask...
  290.         MOV     AX,0FF08h               ; 00000000b
  291.         OUT     DX,AX
  292.         POP     DS
  293.     @@ret:
  294.         RET
  295.  
  296.  
  297. ROTPLANE MACRO
  298.     LOCAL @@c1
  299.         ADD     AH,AH
  300.         TEST    AH,10h
  301.         JZ      @@c1
  302.          INC    BX
  303.          MOV    AH,1
  304.      @@c1:
  305.         MOV     DI,BX
  306. ENDM
  307.  
  308.  
  309. RawDrawBall:
  310.         CMP     DI,SCREENOFF1
  311.         JZ      @@bye
  312.         CMP     DI,SCREENOFF2
  313.          JNZ    @@goon
  314.      @@bye:
  315.           RET
  316.      @@goon:
  317.         MOV     AL,BL
  318.         MOV     BL,BALLPIXSZ
  319.         MUL     BL
  320.         MOV     SI,OFFSET BallsPix
  321.         ADD     SI,AX
  322.  
  323.         MOV     BX,0A000h
  324.         MOV     ES,BX
  325.         MOV     BX,DI
  326.  
  327.         MOV     DX,3C4h
  328.         MOV     AX,0102h                ; One plane at a time.
  329.         SHL     AH,CL
  330.         MOV     CX,SCRW-4
  331.  
  332.         OUT     DX,AX                   ; Plane #1
  333.         ADD     DI,2
  334.         MOVSB
  335.         ADD     DI,SCRW-3+1
  336.         MOVSW
  337.         MOVSB
  338.         ADD     DI,SCRW-4+1
  339.         MOVSW
  340.         MOVSB
  341.         ADD     DI,SCRW-4+1
  342.         MOVSW
  343.         MOVSB
  344.         ADD     DI,SCRW-4+1
  345.         MOVSW
  346.         MOVSB
  347.         ADD     DI,CX
  348.  
  349.         REPT 5
  350.            MOVSW
  351.            MOVSW
  352.            ADD  DI,CX
  353.         ENDM
  354.         INC     DI
  355.         MOVSW
  356.         MOVSB
  357.         ADD     DI,SCRW-4+1
  358.         MOVSW
  359.         MOVSB
  360.         ADD     DI,SCRW-4+1
  361.         MOVSW
  362.         MOVSB
  363.         ADD     DI,SCRW-4+1
  364.         MOVSW
  365.         MOVSB
  366.         ADD     DI,SCRW-4+2
  367.         MOVSB              
  368.  
  369.         ROTPLANE
  370.  
  371.         OUT     DX,AX                   ; Plane #2
  372.         INC     DI
  373.         MOVSW
  374.         ADD     DI,SCRW-3+1
  375.         MOVSW
  376.         ADD     DI,SCRW-4+2
  377.         MOVSW
  378.         MOVSB
  379.         ADD     DI,CX
  380.  
  381.         REPT 9
  382.            MOVSW
  383.            MOVSW
  384.            ADD  DI,CX
  385.         ENDM
  386.         INC     DI
  387.         MOVSW
  388.         MOVSB
  389.         ADD     DI,SCRW-4+1
  390.         MOVSW
  391.         ADD     DI,SCRW-4+2
  392.         MOVSW
  393.  
  394.         ROTPLANE
  395.  
  396.         OUT     DX,AX                   ; Plane #3
  397.         INC     DI
  398.         MOVSW
  399.         ADD     DI,SCRW-3+1
  400.         MOVSW
  401.         ADD     DI,SCRW-4+1
  402.         MOVSW
  403.         MOVSB
  404.         ADD     DI,SCRW-4+1
  405.  
  406.         REPT 9
  407.            MOVSW
  408.            MOVSW
  409.            ADD  DI,CX
  410.         ENDM
  411.         MOVSW
  412.         MOVSB
  413.         ADD     DI,SCRW-4+2
  414.         MOVSW
  415.         ADD     DI,SCRW-4+2
  416.         MOVSW              
  417.  
  418.         ROTPLANE
  419.  
  420.         OUT     DX,AX                   ; Plane #4
  421.         INC     DI
  422.         MOVSB
  423.         ADD     DI,SCRW-4+2
  424.         MOVSW
  425.         MOVSB
  426.         ADD     DI,SCRW-4+1
  427.         MOVSW
  428.         MOVSB
  429.         ADD     DI,SCRW-4+1
  430.         MOVSW
  431.         MOVSB
  432.         ADD     DI,SCRW-4+1
  433.         MOVSW
  434.         MOVSB
  435.         ADD     DI,SCRW-4+1
  436.  
  437.         REPT 5
  438.            MOVSW
  439.            MOVSW
  440.            ADD  DI,CX
  441.         ENDM
  442.         MOVSW
  443.         MOVSB
  444.         ADD     DI,SCRW-4+1
  445.         MOVSW
  446.         MOVSB
  447.         ADD     DI,SCRW-4+1
  448.         MOVSW
  449.         MOVSB
  450.         ADD     DI,SCRW-4+1
  451.         MOVSW
  452.         MOVSB
  453.         ADD     DI,SCRW-4+2
  454.         MOVSB              
  455.  
  456.         RET
  457.  
  458. ; =======================================
  459.  
  460. CalcCoord:
  461.         MOV     DI,[SI]
  462.         SHR     DI,CRDMULT
  463.         MOV     CX,DI
  464.         AND     CL,3
  465.         SHR     DI,2
  466.         MOV     AX,200 SHL CRDMULT
  467.         SUB     AX,[SI+2]
  468.         SHR     AX,CRDMULT
  469. ;        NEG     AX
  470. ;        ADD     AX,216
  471.         MOV     DX,SCRW
  472.         MUL     DX
  473.         ADD     DI,AX
  474.         CMP     DI,SCREENOFF2
  475.         JC      @@ok
  476.          XOR    DI,DI
  477.    @@ok:
  478.         RET
  479.  
  480. ; =======================================
  481.  
  482.  
  483. MoveBall:
  484.         MOV     BP,(320-16) SHL CRDMULT
  485.         CALL    @@movcoord
  486.         MOV     BP,(250) SHL CRDMULT
  487.         ADD     SI,2
  488.  
  489.    @@movcoord:
  490.         MOV     AX,[SI]
  491.         MOV     DX,[SI+4]
  492.         ADD     AX,DX
  493.         CMP     AX,BP
  494.         JC      @@ok
  495.          NEG    DX
  496.          ADD    AX,DX
  497.          MOV    [SI+4],DX
  498.      @@ok:
  499.         MOV     [SI],AX
  500.         RET
  501.        
  502. ; =======================================
  503.  
  504. AnimateBalls:
  505.         DEC     CX
  506.         MOV     [DrawFlag],CX
  507.         MOV     SI,OFFSET BallCoord
  508.         MOV     CL,[NBalls]
  509.         OR      CL,CL
  510.         JZ      @@bye
  511.  
  512.      @@l1:
  513.         PUSH    CX
  514.         PUSH    SI
  515.         CALL    EraseBall
  516.         POP     SI
  517.         ADD     SI,SZBALL
  518.         POP     CX
  519.         DEC     CL
  520.         JNZ     @@l1
  521.  
  522.         MOV     [DoNotStop],0
  523.  
  524.         MOV     SI,OFFSET BallCoord
  525.         MOV     CL,[NBalls]
  526.      @@l2:
  527.         PUSH    CX
  528.         PUSH    SI
  529.         CALL    MoveBall
  530.         MOV     BX,0
  531.         MOV     AL,0
  532.         CALL    VTCheckSemaphore
  533.         POP     SI
  534.         JNZ     @@bail
  535.          DEC    WORD PTR [SI+3*2]               ; Gravedad.
  536.          MOV    [DoNotStop],1
  537.          JMP    @@goon
  538.     @@bail:
  539.          INC    WORD PTR [SI+3*2]               ; Antigravedad.
  540.          CMP    WORD PTR [SI+1*2],216 SHL CRDMULT
  541.          JNC    @@jc1
  542.          MOV    [DoNotStop],1
  543.          JMP    @@goon
  544.     @@jc1:
  545.           MOV   WORD PTR [SI],0
  546.           MOV   WORD PTR [SI+1*2],250 SHL CRDMULT
  547.           MOV   WORD PTR [SI+2*2],0
  548.           MOV   WORD PTR [SI+3*2],0
  549.     @@goon:
  550.         PUSH    SI
  551.         CMP     [DrawFlag],0
  552.         JNZ     @@nx
  553.         CALL    CalcCoord
  554.         TEST    [FrameCounter],1
  555.         JNZ     @@c1
  556.          ADD    DI,SCREENOFF2
  557.          MOV    [SI+14],DI
  558.          MOV    [SI+11],CL
  559.          JMP    @@cc
  560.      @@c1:
  561.          MOV    [SI+12],DI
  562.          MOV    [SI+10],CL
  563.      @@cc:
  564.         MOV     BL,[SI+8]
  565.         CALL    RawDrawBall
  566.      @@nx:
  567.         POP     SI
  568.         ADD     SI,SZBALL
  569.         POP     CX
  570.         DEC     CL
  571.         JNZ     @@l2
  572.      @@bye:
  573.         RET
  574.  
  575. ; =======================================
  576.  
  577. TestCollisions:
  578.         MOV     SI,OFFSET BallCoord
  579.         MOV     CL,[NBalls]
  580.         OR      CL,CL
  581.         JNZ     @@l1
  582.          RET
  583.      @@l1:
  584.         PUSH    CX
  585.         PUSH    SI
  586.  
  587.         DEC     CL
  588.         JZ      @@next
  589.         XOR     CH,CH
  590.         LEA     DI,[SI+SZBALL]
  591.      @@l2:
  592.         MOV     BP,[SI]
  593.         SUB     BP,[DI]
  594.         JNS     @@c1
  595.          NEG    BP                      ; BP = ABS(deltaX).
  596.      @@c1:
  597.         CMP     BP,16 SHL CRDMULT
  598.         JGE     @@nx2
  599.         MOV     BX,[SI+2]
  600.         SUB     BX,[DI+2]
  601.         JNS     @@c2
  602.          NEG    BX                      ; BX = ABS(deltaY).
  603.      @@c2:
  604.         CMP     BX,16 SHL CRDMULT
  605.         JGE     @@nx2
  606.          SetBorder 63, 63, 63
  607.         MOV     AX,BP
  608.         IMUL    AX
  609.         MOV     BP,AX
  610.         MOV     AX,BX
  611.         IMUL    AX
  612.         ADD     BP,AX
  613.         CMP     BP,16*16 SHL (CRDMULT*2)
  614.         JNC     @@nx2
  615.                 ; Hay colisión.
  616.  
  617.         INC     CH                              ; There is a collision.
  618.         CMP     [SI+9],CL                       ; The same ball as before?
  619.         JZ      @@nx2                           ; If so, don't bounce.
  620.         MOV     [SI+9],CL                       ; Mark this ball.
  621.  
  622.         CMP     BX,13 SHL CRDMULT
  623.         JC      @@nox
  624.         MOV     AX,[SI+6]                       ; Swap velY.
  625.         SUB     AX,[DI+6]
  626.         SUB     [SI+6],AX
  627.         ADD     [DI+6],AX
  628.         JMP     @@nx2
  629.     @@nox:
  630.         CMP     BX,3 SHL CRDMULT
  631.         JNC     @@xy
  632.         MOV     AX,[SI+4]                       ; Swap velX.
  633.         SUB     AX,[DI+4]
  634.         SUB     [SI+4],AX
  635.         ADD     [DI+4],AX
  636.         JMP     @@nx2
  637.     @@xy:
  638.         MOV     BX,[SI+4]                       ; Swap both speeds half.
  639.         SUB     BX,[DI+4]
  640.         MOV     DX,[SI+6]
  641.         SUB     DX,[DI+6]
  642.         SAR     BX,1
  643.         SUB     [SI+4],BX
  644.         SUB     [SI+6],BX
  645.         ADD     [DI+4],BX
  646.         ADD     [DI+6],BX
  647.         SAR     DX,1
  648.         SUB     [SI+4],DX
  649.         SUB     [SI+6],DX
  650.         ADD     [DI+4],DX
  651.         ADD     [DI+6],DX
  652.  
  653.      @@nx2:
  654.         ADD     DI,SZBALL
  655.         DEC     CL
  656.         JNZ     @@l2
  657.         OR      CH,CH                           ; If no collisions occured,
  658.         JNZ     @@next
  659.          MOV     BYTE PTR [SI+9],CH             ; ...clear collBall flag.
  660.  
  661.    @@next:
  662.         POP     SI
  663.         POP     CX
  664.         ADD     SI,SZBALL
  665.         DEC     CL
  666.         JNZ     @@l1
  667.  
  668.         RET
  669.  
  670. ; =======================================
  671.  
  672. CreateBalls:
  673.         CMP     [NBalls],NBALLS
  674.         JNC     @@bye
  675.         CMP     [FrameCounter],2
  676. ;COMMENT #
  677.         JC      @@create
  678.         CMP     [FrameCounter],135
  679.         JZ      @@create
  680.         CMP     [FrameCounter],373
  681.         JZ      @@create
  682.         CMP     [FrameCounter],1070
  683.         JC      @@bye
  684. ;#
  685.         TEST    [FrameCounter],7
  686.         JNZ     @@bye
  687.     @@create:
  688.          MOV    BL,[NBalls]
  689.          INC    [NBalls]
  690.          XOR    BH,BH
  691.          MOV    AX,BX
  692.          MOV    DL,13
  693.          DIV    DL
  694.          SHL    BX,4    ;SZBALL
  695.          MOV    DI,OFFSET BallCoord
  696.          ADD    DI,BX
  697.          MOV    WORD PTR [DI],200 SHL CRDMULT
  698.          MOV    WORD PTR [DI+2],216 SHL CRDMULT
  699.          MOV    WORD PTR [DI+4],-(1 SHL CRDMULT)
  700.          MOV    WORD PTR [DI+6],0
  701.          MOV    BYTE PTR [DI+8],AH
  702.          MOV    BYTE PTR [DI+9],0
  703.          MOV    BYTE PTR [DI+10],0
  704.          MOV    BYTE PTR [DI+11],0
  705.          MOV    WORD PTR [DI+12],0
  706.          MOV    WORD PTR [DI+14],0
  707.  
  708.     @@bye:
  709.         RET
  710.  
  711. ; =======================================
  712.  
  713. SetDisplayPage:
  714.         MOV     DX,3D4h
  715.         MOV     BX,SCREENOFF1+16*SCRW
  716.         TEST    [FrameCounter],1
  717.         JNZ      @@scrst
  718.          MOV    BX,SCREENOFF2+16*SCRW
  719.     @@scrst:
  720.         MOV     AL,0Ch
  721.         MOV     AH,BH
  722.         OUT     DX,AX
  723.         INC     AL
  724.         MOV     AH,BL
  725.         OUT     DX,AX
  726.         RET
  727.  
  728. ; =======================================
  729.  
  730. CreateBallsPix:
  731.         MOV     CL,NBALLS
  732.         MOV     DI,OFFSET BallsPix
  733.         XOR     CH,CH
  734.     @@l1:
  735.         MOV     SI,OFFSET ORGBallPix
  736.         CALL    @@r1
  737.         MOV     SI,OFFSET ORGBallPix+1
  738.         CALL    @@r1
  739.         MOV     SI,OFFSET ORGBallPix+2
  740.         CALL    @@r1
  741.         MOV     SI,OFFSET ORGBallPix+3
  742.         CALL    @@r1
  743.         ADD     CH,6
  744.         DEC     CL
  745.         JNZ     @@l1
  746.         RET
  747.   @@r1:
  748.         MOV     BL,15*16/4
  749.       @@l2:
  750.          MOV    AL,[SI]
  751.          OR     AL,AL
  752.          JZ     @@nopix
  753.           ADD   AL,CH
  754.           MOV   [DI],AL
  755.           INC   DI
  756.       @@nopix:
  757.          ADD    SI,4
  758.          DEC    BL
  759.          JNZ    @@l2
  760.          RET
  761.  
  762. ; =======================================
  763. ; =======================================
  764. ; =======================================
  765.  
  766.  
  767.         .DATA
  768.  
  769. CRTCregs LABEL BYTE                                               ; Modo 13h
  770.   DB 11h, 04h       ; End   vertical retrace. (0-0Fh)             ; DB 11h, 8Eh
  771.   DB 00h, 64h       ; Horizontal total.                           ; DB 00h, 5Fh
  772.   DB 01h, 4Fh       ; Horizontal display enable end.              ; DB 01h, 4Fh
  773.   DB 02h, 50h       ; Start horizontal blanking.                  ; DB 02h, 50h
  774.   DB 03h, 80h+07h   ; End   horizontal blanking. (0-1Fh)          ; DB 03h, 82h
  775.   DB 04h, 5Bh       ; Start horizontal retrace.                   ; DB 04h, 54h
  776.   DB 05h, 80h+05h   ; End   horizontal retrace. (0-1Fh)           ; DB 05h, 80h
  777.   DB 06h,0FFh       ; Vertical total. (+7.0 +7.5)                 ; DB 06h, BFh
  778.   DB 07h, 00011111b ; Overflow (high bits of vertical registers). ; DB 07h, 1Fh
  779.   DB 08h, 00h                                                     ; DB 08h, 00h
  780.   DB 09h, 41h                                                     ; DB 09h, 41h
  781.   DB 0Ah, 00h                                                     ; DB 0Ah, 00h
  782.   DB 0Bh, 00h                                                     ; DB 0Bh, 00h
  783.   DB 0Ch, 00h                                                     ; DB 0Ch, 00h
  784.   DB 0Dh, 00h                                                     ; DB 0Dh, 00h
  785.   DB 0Eh, 00h                                                     ; DB 0Eh, 00h
  786.   DB 0Fh, 00h                                                     ; DB 0Fh, 00h
  787.   DB 10h,0C0h       ; Start vertical retrace. (+7.2 +7.7)         ; DB 10h, 9Ch
  788. ;                 
  789. ;    11h      ────┘ ; End   vertical retrace. (0-0Fh)
  790.   DB 12h, 8Fh       ; Vertical display enable end. (+7.1 +7.6)    ; DB 12h, 8Fh
  791.   DB 13h, 28h                                                     ; DB 13h, 28h
  792.   DB 14h, 40h                                                     ; DB 14h, 40h
  793.   DB 15h,097h       ; Start vertical blanking. (+7.3 +9.5)        ; DB 15h, 96h
  794.   DB 16h,0F8h       ; End   vertical blanking.                    ; DB 16h, B9h
  795.   DB 17h,0A3h                                                     ; DB 17h, A3h
  796.   DB 18h,0FFh                                                     ; DB 18h, FFh
  797.  
  798. FrameCounter DW 0
  799. NBalls       DB 0
  800. DoNotStop    DB 1
  801. NFrames      DW 0
  802. DrawFlag     DW 0
  803.  
  804. ORGBallPix LABEL BYTE
  805.         DB 0, 0, 0, 0, 0, 2, 3, 3,  2, 2, 1, 0, 0, 0, 0, 0
  806.         DB 0, 0, 0, 2, 4, 4, 4, 4,  3, 3, 3, 2, 1, 0, 0, 0
  807.         DB 0, 0, 2, 4, 4, 5, 5, 4,  4, 3, 3, 3, 2, 1, 0, 0
  808.         DB 0, 2, 4, 5, 6, 6, 5, 4,  4, 3, 3, 3, 2, 2, 1, 0
  809.         DB 0, 4, 4, 6, 6, 6, 5, 4,  4, 3, 3, 3, 2, 2, 2, 0
  810.  
  811.         DB 2, 4, 5, 6, 6, 5, 5, 4,  3, 3, 3, 3, 2, 2, 2, 1
  812.         DB 3, 4, 5, 5, 5, 5, 4, 4,  3, 3, 3, 2, 2, 2, 2, 1
  813.         DB 2, 4, 4, 4, 4, 4, 4, 3,  3, 3, 3, 2, 2, 2, 1, 1
  814.         DB 2, 3, 4, 4, 4, 3, 3, 3,  3, 3, 2, 2, 2, 2, 1, 1
  815.         DB 1, 2, 3, 3, 3, 3, 3, 3,  3, 2, 2, 2, 2, 2, 1, 1
  816.  
  817.         DB 0, 2, 2, 3, 3, 3, 3, 2,  2, 2, 2, 2, 2, 1, 1, 0
  818.         DB 0, 1, 2, 2, 2, 2, 2, 2,  2, 2, 2, 2, 1, 1, 1, 0
  819.         DB 0, 0, 1, 2, 2, 2, 2, 2,  2, 2, 1, 1, 1, 1, 0, 0
  820.         DB 0, 0, 0, 1, 1, 1, 1, 1,  1, 1, 1, 1, 1, 0, 0, 0
  821.         DB 0, 0, 0, 0, 0, 1, 1, 1,  1, 1, 1, 0, 0, 0, 0, 0
  822.  
  823. NormalPalette LABEL BYTE
  824.         INCLUDE BALLSPAL.INC
  825.  
  826.         UDATASEG
  827.  
  828. BallsPix LABEL BYTE
  829.         DB NBALLS*BALLPIXSZ DUP (?)
  830.  
  831. BallCoord LABEL WORD
  832.         DB NBALLS*SZBALL DUP (?)
  833.  
  834. SourcePalette DB 256*3 DUP (?)
  835.  
  836.         END
  837. ; ------------------------------ End of BALLS.ASM ---------------------------
  838.  
  839.